﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using System.Windows.Threading;
using System.IO;
using System.Collections.Generic;

namespace RecorderSound.Model
{
    public class Record : IRecorder
    {
        #region mebers

        Microphone microphone = Microphone.Default;
       // byte[] buffer;
        MemoryStream stream;
        SoundEffect sound;
       protected List<byte[]> buffercollection = new List<byte[]>();
       int readed;
        #endregion

        public Record()
        {
            //wywołanie zdarzenia
            Ready();
        }
        //event
        public void Ready()
        {
            SoundEffect.MasterVolume = 1.0f;
            //zdarzenie które występuje gdy dzwiek bufora przechwytywania jest gotowy do przetworzenia
            microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
            //timer
            DispatcherTimer dt = new DispatcherTimer();
            dt.Interval = TimeSpan.FromMilliseconds(33);
            dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
            dt.Start();
        }
        public void microphone_BufferReady(object sender, EventArgs e)
        {
            //pobiera ostatnie nagrane dane z mikrofona na podstawie bufora przechwytywania 
            //zapisuje blok bajtow do biezacego strumienia przy uzyciu danych odczytanych z bufora
           byte[] buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
            microphone.GetData(buffer);
            buffercollection.Add(buffer);
            /*
            byte[] buffer = new byte[1024];
           while((readed = microphone.GetData(buffer, 0, buffer.Length)) >0)
            {      
               stream.Write(buffer, 0, readed);
            }
            */ 
             
        }


        //action recorder
        public void StartRecord()
        {
            buffercollection.Clear();
            //ustawiam czas bufora przechwytywania
            //microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
            //zwraca rozmiar tablicy bajtowej dla zachowania parametrów czasu trwania dzwieku
          byte[] buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
            //start mikrofonu
            stream = new MemoryStream();
            microphone.Start();
        }

        public void StopRecord()
        {
            //zwraca rozmiar tablicy bajtowej dla zachowania parametrów czasu trwania dzwieku
           byte[] buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];

            //sprawdza czy nagrywanie jest wlaczone.Jesli tak to zatrzymuje
            if (microphone.State == MicrophoneState.Started)
            {
                microphone.Stop();
                microphone_BufferReady(null, null);
            }
        }

        public void PlayRecord()
        {
            //inicjalizacja nowej instancji SoundEffect. Bufor ktory ma dane audio, czestotliwos probkowania przy ktorej mikrofon jest przechwytywany,
            //numer kanalu(mono lub stereo)
            if (stream != null)
            {
                stream.Position = 0;
                sound = new SoundEffect(stream.ToArray(), microphone.SampleRate, AudioChannels.Mono);
                //uruchomienie dzwieku
                sound.Play();
            }
            else
            {
                MessageBox.Show("Record somthing first");
            }
        }
    }
}
